/*
 * PhD Software do Brasil / Universa Escola de Gestão.
 * email - professor.flavio.roberto@gmail.com
 *
 * SPB - Simulador do Sistema de Pagamentos Brasileiro do Governo Federal.
 *
 * OBS: Todos os códigos estão sendo oferecidos com a intenção única de
 * estimular o aprendizado. Não podem ser usados com fins comerciais sem
 * autorização prévia do autor. Se redistribuídos para outros sites, o autor e
 * a fonte devem ser sempre citados.
 */
package br.com.phd.bank.spb.servico;


class SPBMediator {

	private static final int CODIGO_RETORNO_SUCESSO = 0;
	private static final int CODIGO_RETORNO_DADOS_INSUFICIENTES = 1;
	private static final int CODIGO_RETORNO_CPF_INVALIDO = 2;
	private static final int CODIGO_RETORNO_TIPO_TED_INVALIDA = 3;
	private static final int CODIGO_RETORNO_VALOR_MENOR_QUE_O_PERMITIDO = 4;
	private static final double TRES_MIL = 3000.00;

	private static SPBMediator instancia = null;

	private SPBMediator() {
		// Construtor privado
	}

	public static SPBMediator get() {
		if (instancia == null) {
			instancia = new SPBMediator();
		}

		return instancia;
	}

	public TransacaoSPB criaTransacao() {
		return new TransacaoSPBImpl();
	}

	public int notificaTransacao(TransacaoSPB transacaoSPB) {
		TransacaoSPBImpl transacaoSPBImpl = (TransacaoSPBImpl) transacaoSPB;

		if (!transacaoSPBImpl.validaDados())
			return CODIGO_RETORNO_DADOS_INSUFICIENTES;

		if (!Util.isCpfValido(transacaoSPBImpl.getCpfDoTitular()))
			return CODIGO_RETORNO_CPF_INVALIDO;

		return CODIGO_RETORNO_SUCESSO;
	}

	public TED criaTED() {
		return new TEDImpl();
	}

	public int registraTED(TED ted) {
		TEDImpl tedImpl = (TEDImpl) ted;

		if (!tedImpl.validaDados())
			return CODIGO_RETORNO_DADOS_INSUFICIENTES;

		if (!Util.isCpfValido(tedImpl.getCpfDaContaFavorecida()))
			return CODIGO_RETORNO_CPF_INVALIDO;

		if (!validaTipoDaTED(tedImpl))
			return CODIGO_RETORNO_TIPO_TED_INVALIDA;

		if (tedImpl.getValorDaTransacao() < TRES_MIL) {
			return CODIGO_RETORNO_VALOR_MENOR_QUE_O_PERMITIDO;
		}

		return CODIGO_RETORNO_SUCESSO;
	}

	private boolean validaTipoDaTED(TEDImpl tedImpl) {
		switch (tedImpl.getTipoDaTED()) {
		case 'C':
			return true;

		case 'D':
			return true;

		default:
			return false;
		}
	}
}